home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm1.lha / SORGENTI / LEZIONE3b.s < prev    next >
Text File  |  1994-10-30  |  14KB  |  307 lines

  1.  
  2. ; Lezione3b.s    ; LA PRIMA COPPERLIST
  3.  
  4.  
  5.     SECTION    PRIMOCOP,CODE    ; Questo comando fa caricare dal sistema
  6.                 ; operativo questa parte di codice
  7.                 ; in FAST ram, se e' libera, oppure se c'e'
  8.                 ; solo CHIP la carica in CHIP.
  9.  
  10. Inizio:
  11.     move.l    4.w,a6        ; Execbase in a6
  12.     jsr    -$78(a6)    ; Disable - ferma il multitasking
  13.     lea    GfxName,a1    ; Indirizzo del nome della lib da aprire in a1
  14.     jsr    -$198(a6)    ; OpenLibrary, routine della EXEC che apre
  15.                 ; le librerie, e da in uscita in d0 l'indirizzo
  16.                 ; di base di quella libreria da cui fare le
  17.                 ; distanze di indirizzamento (Offset)
  18.     move.l    d0,GfxBase    ; salvo l'indirizzo base GFX in GfxBase
  19.     move.l    d0,a6
  20.     move.l    $26(a6),OldCop    ; salviamo l'indirizzo della copperlist
  21.                 ; di sistema (sempre a $26 della GfxBase)
  22.     move.l    #COPPERLIST,$dff080    ; COP1LC - Puntiamo la nostra COP
  23.     move.w    d0,$dff088        ; COPJMP1 - Facciamo partire la COP
  24. mouse:
  25.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  26.     bne.s    mouse        ; se no, torna a mouse:
  27.  
  28.     move.l    OldCop(PC),$dff080    ; COP1LC - Puntiamo la cop di sistema
  29.     move.w    d0,$dff088        ; COPJMP1 - facciamo partire la cop
  30.  
  31.     move.l    4.w,a6
  32.     jsr    -$7e(a6)    ; Enable - riabilita il Multitasking
  33.     move.l    gfxbase(PC),a1    ; Base della libreria da chiudere
  34.                 ; (vanno aperte e chiuse le librerie!!!)
  35.     jsr    -$19e(a6)    ; Closelibrary - chiudo la graphics lib
  36.     rts
  37.  
  38. GfxName:
  39.     dc.b    "graphics.library",0,0    ; NOTA: per mettere in memoria
  40.                     ; dei caratteri usare sempre il dc.b
  41.                     ; e metterli tra "", oppure ''
  42.                     ; terminando con ,0
  43.  
  44.  
  45. GfxBase:        ; Qua ci va l'indirizzo di base per gli Offset
  46.     dc.l    0    ; della graphics.library
  47.  
  48.  
  49.  
  50. OldCop:            ; Qua ci va l'indirizzo della vecchia COP di sistema
  51.     dc.l    0
  52.  
  53.     SECTION    GRAPHIC,DATA_C    ; Questo comando fa caricare dal sistema
  54.                 ; operativo questo segmento di dati
  55.                 ; in CHIP RAM, obbligatoriamente
  56.                 ; Le copperlist DEVONO essere in CHIP RAM!
  57.  
  58. COPPERLIST:
  59.     dc.w    $100,$200    ; BPLCON0 - Nessuna figura, solo lo sfondo
  60.     dc.w    $180,$000    ; Color 0 NERO
  61.     dc.w    $7f07,$FFFE    ; WAIT - Aspetta la linea $7f (127)
  62.     dc.w    $180,$00F    ; Color 0 BLU
  63.     dc.w    $FFFF,$FFFE    ; FINE DELLA COPPERLIST
  64.  
  65.     end
  66.  
  67. Questo programma fa "puntare" una nostra COPPERLIST, e puo' essere usato
  68. per far puntare una qualsiasi COPPERLIST, quindi e' utile per fare esperimenti
  69. col COPPER. NON DOVETE SCORAGGIARVI DALL'UTILIZZO DEL SISTEMA OPERATIVO
  70. CON L'APERTURA DELLE LIBRERIE E AFFINI, IN QUANTO IN TUTTO IL CORSO TROVERETE
  71. SOLTANTO L'APERTURA DELLA GRAPHICS.LIBRARY PER RIMETTERE A POSTO LA VECCHIA
  72. COPPERLIST E POCHE ALTRE COSE, BASTERA' DUNQUE IMPARARSI QUESTE POCHE COSE.
  73. NOTA1: Come avete gia' notato questo listato contiene il comando SECTION,
  74. che ha la funzione di decidere gli HUNK del file eseguibile che salverete
  75. con il comando WO: ogni file eseguibile dallo shell, come ad esempio lo
  76. stesso ASMONE, e' messo in memoria RAM dal sistema operativo copiandolo dal
  77. dischetto o dall'hard disk, e questa azione di copia viene effettuata a
  78. seconda degli HUNK del file in questione, che non sono altro che parti di
  79. quel file, infatti un file e' formato da uno o piu' hunk. Ogni hunk ha la
  80. sua caratteristica, in particolare quella di DOVE DEVE ESSERE CARICATO, se solo
  81. in CHIP RAM o se e' possibile metterlo anche in FAST RAM; e' necessario
  82. usare il comando SECTION se si desidera generare un file eseguibile con delle
  83. copperlist o con dei suoni, infatti questo tipo di dati deve essere caricato
  84. sempre in CHIP RAM, altrimenti, se non si specifica il _C, il file generato con
  85. il WO avra' un hunk generico che puo' essere caricato in qualsiasi parte di
  86. memoria libera, sia essa CHIP o FAST. Molte vecchie demo o addirittura delle
  87. demo per Amiga 1200 non funzionano su Amiga con Fast Ram proprio perche' il
  88. file ha degli hunk caricabili in qualsiasi tipo di memoria libera, e non
  89. funziona in computer con FAST memory, in quanto il sistema operativo tende
  90. a riempire prima la FAST RAM della preziosa CHIP RAM: evidentemente coloro
  91. che hanno fatto quelle vecchie demo o giochi avevano l'amiga 500 di base con
  92. 512k di chip ram, senza FAST, e i programmi gli funzionavano perche' venivano
  93. comunque caricati in CHIP, lo stesso valga per chi ha un a500+ o un a600,
  94. infatti hanno 1MB di CHIP solamente, ma quando questi programmi sono
  95. caricati su un computer con la FAST ram, le FIGURE, i SUONI e le COPPERLIST
  96. sono caricate in FAST RAM ed essendo i CHIP CUSTOM in grado di accedere
  97. solamente alla memoria CHIP fanno dei suoni casuali e il video impazzisce,
  98. generando alle volte degli inchiodamenti del sistema.
  99. La sintassi del comando SECTION e' la seguente: dopo la parola SECTION si deve
  100. scrivere il nome di quella sezione, date pure un nome a piacere, dopodiche'
  101. si scrive quale tipo di section definiamo: se CODE o DATA, ovvero se fatta
  102. di ISTRUZIONI o di DATI, differenza che pero' non e' molto importante, infatti
  103. si definisce sezione CODE la prima di questo listato, che ha anche delle LABEL
  104. con dei testi (dc.b 'graphics library'); dopodiche' si decide la cosa piu'
  105. importante: se va caricata in CHIP o se va bene anche in FAST memory: per
  106. decidere che deve essere CARICATA per forza in CHIP basta aggiungere un _C
  107. al DATA o al CODE, se invece non e' aggiunto niente significa che i dati o
  108. le istruzioni nella sezione sono caricabili in qualsiasi tipo di memoria.
  109. Alcuni esempi:
  110.  
  111.     SECTION FIGURE,DATA_C    ; sezione di dati da caricare in CHIP
  112.     SECTION    LISTANOMI,DATA    ; sezione di dati caricabile in CHIP o FAST
  113.     SECTION Program,CODE_C    ; sezione di codice da caricare in CHIP
  114.     SECTION Program2,CODE    ; sezione di codice caricabile in CHIP o FAST
  115.  
  116. Mettete la prima SECTION sempre come CODE o CODE_C, iniziando ovviamente con
  117. delle istruzioni, dopodiche' potete fare delle section DATA o DATA_C dove non
  118. ci sono istruzioni, facciamo un esempio:
  119.  
  120.     SECTION    Myprogram,CODE    ; Caricabile sia in CHIP che in FAST
  121.  
  122.     move...
  123.     move...
  124.  
  125.     SECTION    COPPER,DATA_C    ; Assemblabile solo in CHIP
  126.  
  127.     dc.w    $100,$200....    ; $0100,$0200, ma si possono togliere
  128.                 ; gli zeri iniziali, se per esempio
  129.                 ; dobbiamo scrivere dc.l $00000001
  130.                 ; sara' piu' comodo scrovere dc.l 1
  131.                 ; allo stesso modo dc.b $0a si puo'
  132.                 ; scrivere dc.b $a, in memoria sara'
  133.                 ; assemblato $0a.
  134.  
  135.     SECTION    MUSICA,DATA_C    ; Assemblabile solo in CHIP
  136.  
  137.     dc.b    Pavarotti.....
  138.  
  139.     SECTION    FIGURE,DATA_C    ; solo in CHIP!
  140.  
  141.     dc.l    piramidi egizie
  142.  
  143.     END
  144.  
  145. Si puo' fare anche tutta una unica section CODE_C, ma frammentare almeno
  146. a pezzi di 50k i dati grafici o sonori rende il programma piu' facile da
  147. allocare nei buchetti della memoria di un unico pezzettone da 300k o piu'.
  148. Inoltre considerate che caricare le istruzioni in CHIP RAM e' un peccato
  149. anche perche' se sono caricate in FAST RAM, specie su un Amiga con 68020+,
  150. sono eseguite piu' velocemente, anche di 4 volte, rispetto alla mem CHIP.
  151. Esistono anche le section di tipo BSS o BSS_C, ne parleremo quando le useremo.
  152. NOTA2: Avrete notato anche l'uso di (PC) nell'istruzione:
  153.  
  154.     move.l    OldCop(PC),$dff080    ; COP1LC - Puntiamo la cop di sistema
  155.  
  156. Questo (PC) aggiunto dopo il nome della label non cambia la FUNZIONE del
  157. comando, infatti se togliete il (PC) succede la stessa cosa; piuttosto serve
  158. a cambiare la FORMA del comando, infatti provate ad assemblare e fare un
  159. D Mouse:
  160.  
  161.     ...            BTST    #$06,$00BFE001
  162.     ...            BNE.B    $xxxxxxxx
  163.     23FA003400DFF080    MOVE.L    $xxxxxx(PC),$00DFF080
  164.     ...            MOVE.W    D0,$00DFF088
  165.  
  166. Noterete che il move.l Oldcop(PC),$dff080 viene assemblato come $23fa....
  167.  
  168. Provate ora a togliere il (PC), assemblate e rifate D MOUSE:
  169.  
  170.     23F900xxxxxx00DFF080    MOVE.L    $xxxxxx,$00DFF080
  171.  
  172. Questa volta l'istruzione viene assemblata in 10 bytes anziche' 8, e si
  173. legge chiaramente dopo il $23f9, che significa MOVE.L, l'indirizzo di Oldcop,
  174. mentre nel caso del move.l con PC il comando inizia con $23fa e si vede in $34
  175. anziche' l'indirizzo di OldCop!!! La differenza e' che quando non c'e' il
  176. PC l'istruzione si riferisce ad un INDIRIZZO DEFINITO, infatti e' assemblato,
  177. mentre un'istruzione col (PC) anziche' scrivere l'indirizzo scrive la distanza
  178. che c'e' da se alla label in questione, in questo caso $34 bytes.
  179. Le struzioni col (PC) si dicono RELATIVE AL PC, ossia al Program Counter, che
  180. e' il registro dove e' scritto l'indirizzo dell'istruzione in esecuzione:
  181. quando il 68000 arriva ad eseguire il MOVE.L OLDCOP(PC), calcola l'indirizzo
  182. in PC+$34 ed ottiene l'indirizzo di Oldcop, appunto situato $34 bytes piu'
  183. avanti. Questo modo e' piu' veloce e le istruzioni come gia' visto sono piu'
  184. corte, ma si possono solo usare per label non piu' lontane di 32768 (come per
  185. il BSR), e non si possono usare tra una section e l'altra, proprio perche'
  186. le section sono caricate in chissa' che punto e chissa' che distanza in memoria
  187. e quindi sarebbero troppo lontane. Infatti provate ad aggiungere la linea
  188. LEA COPPERLIST(PC),a0 all'inizio del listato e constaterete che tentando di
  189. assembllare ASMONE vi comunica un RELATIVE MODE ERROR, mentre togliendo il (PC)
  190. l'istruzione viene assemblata. Vi consiglio di mettere sempre il (PC) alle
  191. label quando e' possibile:
  192.  
  193.     LEA    LABEL(PC),a0
  194.     MOVE.L    LABEL(PC),d0
  195.     MOVE.L    LABEL1(PC),LABEL2    ; solo la prima label puo' essere
  196.                     ; seguita dal PC, la seconda MAI.
  197.     MOVE.L    #LABEL1,LABEL2        ; in questo caso infatti non
  198.                     ; si puo' mettere il (PC) ne' al
  199.                     ; primo operando ne' al secondo.
  200.  
  201. NODIFICHE: Ora potete farvi qualsiasi copperlist! cominciate cambiando i 2
  202. colori sapendo che il formato e' questo: $0RGB, in cui cioe' contano solo 3
  203. numeri, $RGB, con R=RED,ossia ROSSO, G=GREEN,ossia VERDE, B=BLU
  204. Ognuno di questi 3 numeri possono andare da 0 a 15, in notazione esadecimale,
  205. cioe' da 0 ad F (0123456789ABCDEF), e a seconda di come si mischiano questi
  206. 3 colori di base si possono formare tutti i 4096 colori dell'Amiga (16*16*16).
  207. Per ottenere il nero serve un $000, per un bianco un $FFF, un $999 e' grigio.
  208. Attenzione! Non si mischiano come i colori a tempera o ad olio! per esempio
  209. per fare il giallo occorrono ROSSO+VERDE, $dd0 ad esempio, per fare un viola
  210. si devono mischiare ROSSO+BLU, ad esempio $d0e.
  211. Questo sistema di mix dei colori e' lo stesso che trovate nelle PREFERENCES
  212. del WorkBench o nella palette del DPAINT, con i 3 regolatori RGB.
  213. Una volta fatte delle prove cambiando la prima copperlist, potete creare
  214. delle sfumature, aggiungendo dei WAIT e dei COLOR 0 ($180,xxx), simili ai
  215. tramonti che avete visto negli sfondi di SHADOW OF THE BEAST o di altri
  216. giochi, o alle sfumature a barre di tante demo: ora sapete come funzionano!
  217. Sostituite con Amiga+B+C+I questa copperlist a quella nel listato, osservate
  218. cosa visualizza e perche', e modificatela per sincerarvi che avete chiaro
  219. tutto, oppure per fare le sfumature di sfondo per il vostro primo gioco!!!
  220.  
  221. COPPERLIST:
  222.     dc.w    $100,$200    ; BPLCON0 - solo sfondo
  223.     dc.w    $180,$000    ; COLOR0 - Inizio la cop col colore NERO
  224.     dc.w    $4907,$FFFE    ; WAIT - Aspetto la linea $49 (73)
  225.     dc.w    $180,$001    ; COLOR0 - blu scurissimo
  226.     dc.w    $4a07,$FFFE    ; WAIT - linea 74 ($4a)
  227.     dc.w    $180,$002    ; COLOR0 - blu un po' piu' intenso
  228.     dc.w    $4b07,$FFFE    ; WAIT - linea 75 ($4b)
  229.     dc.w    $180,$003    ; COLOR0 - blu piu' chiaro
  230.     dc.w    $4c07,$FFFE    ; WAIT - prossima linea
  231.     dc.w    $180,$004    ; COLOR0 - blu piu' chiaro
  232.     dc.w    $4d07,$FFFE    ; WAIT - prossima linea
  233.     dc.w    $180,$005    ; COLOR0 - blu piu' chiaro
  234.     dc.w    $4e07,$FFFE    ; WAIT - prossima linea
  235.     dc.w    $180,$006    ; COLOR0 - blu a 6
  236.     dc.w    $5007,$FFFE    ; WAIT - salto 2 linee: da $4e a $50, ossia da 78 a 80
  237.     dc.w    $180,$007    ; COLOR0 - blu a 7
  238.     dc.w    $5207,$FFFE    ; WAIT - sato 2 linee
  239.     dc.w    $180,$008    ; COLOR0 - blu a 8
  240.     dc.w    $5507,$FFFE    ; WAIT - salto 3 linee
  241.     dc.w    $180,$009    ; COLOR0 - blu a 9
  242.     dc.w    $5807,$FFFE    ; WAIT - salto 3 linee
  243.     dc.w    $180,$00a    ; COLOR0 - blu a 10
  244.     dc.w    $5b07,$FFFE    ; WAIT - salto 3 linee
  245.     dc.w    $180,$00b    ; COLOR0 - blu a 11
  246.     dc.w    $5e07,$FFFE    ; WAIT - salto 3 linee
  247.     dc.w    $180,$00c    ; COLOR0 - blu a 12
  248.     dc.w    $6207,$FFFE    ; WAIT - salto 4 linee
  249.     dc.w    $180,$00d    ; COLOR0 - blu a 13
  250.     dc.w    $6707,$FFFE    ; WAIT - salto 5 linee
  251.     dc.w    $180,$00e    ; COLOR0 - blu a 14
  252.     dc.w    $6d07,$FFFE    ; WAIT - salto 6 linee
  253.     dc.w    $180,$00f    ; COLOR0 - blu a 15
  254.     dc.w    $7907,$FFFE    ; WAIT - aspetto la linea $79
  255.     dc.w    $180,$300    ; COLOR0 - inizio la barra rossa: rosso a 3
  256.     dc.w    $7a07,$FFFE    ; WAIT - linea seguente
  257.     dc.w    $180,$600    ; COLOR0 - rosso a 6
  258.     dc.w    $7b07,$FFFE    ; WAIT - 
  259.     dc.w    $180,$900    ; COLOR0 - rosso a 9
  260.     dc.w    $7c07,$FFFE    ; WAIT - 
  261.     dc.w    $180,$c00    ; COLOR0 - rosso a 12
  262.     dc.w    $7d07,$FFFE
  263.     dc.w    $180,$f00    ; rosso a 15 (al massimo)
  264.     dc.w    $7e07,$FFFE
  265.     dc.w    $180,$c00    ; rosso a 12
  266.     dc.w    $7f07,$FFFE
  267.     dc.w    $180,$900    ; rosso a 9
  268.     dc.w    $8007,$FFFE
  269.     dc.w    $180,$600    ; rosso a 6
  270.     dc.w    $8107,$FFFE
  271.     dc.w    $180,$300    ; rosso a 3
  272.     dc.w    $8207,$FFFE
  273.     dc.w    $180,$000    ; colore NERO
  274.     dc.w    $fd07,$FFFE    ; aspetto la linea $FD
  275.     dc.w    $180,$00a    ; blu intensita' 10
  276.     dc.w    $fe07,$FFFE    ; linea seguente
  277.     dc.w    $180,$00f    ; blu intensita' massima (15)
  278.     dc.w    $FFFF,$FFFE    ; FINE DELLA COPPERLIST
  279.  
  280. Riassumendo, se ad esempio alla linea $50 impostate il color0 come verde, le
  281. linee $50 e seguenti saranno verdi, fino a che non viene cambiato nuovamente
  282. il colore dopo un wait, ad esempio un wait $6007.
  283. Un consiglio: per fare questa copperlist OVVIAMENTE non ho scritto tutte le
  284. volte dc.w $180,$... dc.w $xx07,$FFFE!!!! Basta prendersi le due istruzioni:
  285.  
  286.     dc.w    $xx07,$FFFE    ; WAIT
  287.     dc.w    $180,$000    ; COLOR0
  288.  
  289. Selezionarle con Amiga+B, e Amiga+C, poi farne una lunga fila premendo varie
  290. volte Amiga+i:
  291.  
  292.     dc.w    $xx07,$FFFE    ; WAIT
  293.     dc.w    $180,$000    ; COLOR0
  294.     dc.w    $xx07,$FFFE    ; WAIT
  295.     dc.w    $180,$000    ; COLOR0
  296.     dc.w    $xx07,$FFFE    ; WAIT
  297.     dc.w    $180,$000    ; COLOR0
  298.     .....
  299.  
  300. A questo punto basta cambiare le XX del wait e il valore di $180 ogni volta,
  301. e cancellare le istruzioni di troppo con Amiga+B e Amiga+X.
  302. NOTA: Questo si puo' fare anche tra diversi buffer di testo dell'ASMONE,
  303. se per esempio nel buffer F2 ho un listato con una copperlist che voglio
  304. modificare, basta che la selezioni normalmente con Amiga+B e Amiga+C, poi
  305. torno al mio listato, per esempio in F5, e inserisco il pezzo preso
  306. dall'altro listato con Amiga+i.
  307.